package com.zj;

import com.zj.api.HostInfo;
import com.zj.db.DbUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.apache.commons.dbutils.QueryRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @program: monitor147
 * @description:
 * @author: zy
 * @create: 2025-06-04 19:34
 */
public class MonitorServerHandler extends SimpleChannelInboundHandler<Object> {
    private static final Logger logger= LoggerFactory.getLogger(MonitorServerHandler.class);

    //将客户端发送过来的对象反序列化后，插入到数据库
    private static final String SQL_INSERT="insert into t_host_info(host, create_time,used_memory,total_memory, used_cpu) values(?,?,?,?,?)";

    //当通道有数据可读时，会自动调用channelRead0方法
    @Override
                        //obj  客户端发送过来的对象  经过编解码器之后传过来的是对象流
    protected void channelRead0(ChannelHandlerContext ctx, Object obj) throws Exception {
        if(  obj instanceof HostInfo){
            HostInfo hi=(HostInfo)obj;//将obj强转为HostInfo类型
            String clientAddress= ctx.channel().remoteAddress().toString().replace("/","");   //获取到发送信息的客户端地址
            logger.info("收到客户端{}传给服务器{}消息：{}", clientAddress, hi.getHost(),  hi);//进行信息采集时是没有采集地址的，所以这里要手动设置一下
            hi.setHost(   clientAddress  );//手动设置一下主机地址
            //将数据插入到数据库
            QueryRunner qr=new QueryRunner( DbUtil.dataSource );
            int rowsUpdated= qr.update(  SQL_INSERT, hi.getHost(), hi.getCreateTime(), hi.getUsedMemory(), hi.getTotalMemory(), hi.getUsedCpu() );
            logger.info("获取到数据并插入数据库成功:{}", rowsUpdated);

        }
    }
}